Yury13, вроде должно нормально работать в мультиплеере. Но возможны подводные камни.
Вот отредактировал, откомментировал каждую строчку. Красиво и норм. Теперь можно отследить открытие меню или закрытие (сворачивание). Если переделать хэш-таблицу и на хэндл записывать данные. Есть недостаток с отрядами: когда выделяешь несколько юнитов, и переключаешь на раба. То рабом можно вызвать меню. А затем если взять и кнопкой Tab переключить например на след выделенного в отряде, то система до сих пор будет считать, что меню остается открытой (система: юнит то выделен, все впорядке). Тогда у вас работник будет подсвечиваться радиус, в то же время вы переключены на другого юнита в отряде - что есть не очень хорошо. Я не смог ничего такого найти с переключениями, даже не знаю как это исправить (возможно придется отказаться работать в группе во время стройки). Вроде драколич в мемхаке давно скидывал код на выделенного юнита, могу скинуть? но мемхаком больше не хочу заниматься
Есть другой способ скрыть ВСЕ кнопки.
Buttonpos=0,-11
не обязательно юзать текстовик, чтобы скрыть меню, можно попробовать в самих абилках "строительство" задать положение x,y - 'AHbu'/'AObu'/'AUbu'/'AEbu'/'AGbu'/'ANbu'
Если у юнита тип перемещения включён на "нет", но есть скорость перемещения, он будет перемещаться сквозь любые объекты. Если же у него перемещение стоит "летающий", то его могут заблочить только воздушные юниты и воздушные блокираторы пути. Но в случае с летающим типом, это станет заметно как он "плавно" взбирается на вертикальные стены рельефа.
orc01, хм... Ладно, попробую сейчас.
Всё, нашёл как нужно было сделать
Через то же что и первый раз делал, только выбрал всех юнитов игрока красного, то есть - одного героя. И сразу все стало нормально)
8gabriel8, стандартные порталы как раз включаются триггером, так же триггерно им можно назначать области телепорта, так же они не ломают карту путей.
Насчет упираются в здание, карту путей ставь от портала, физ размер в 0.
Оригинально) Круто, что работает.
По идее нужно не mdx открывать в Блокноте, а пересохранить модель в формат mdl и открывать в Блокноте её. Файлы tga являются просто другим форматом текстур, который используется в игре. Если слишком много весят, можешь перевести в blp, но считается, что у tga качество получше.
Пути импорта хранятся внутри карты в файле .imp, который имеет бинарный формат. Соответственно, чтобы это заработало, надо добавить кнопку в меню по нажатию которой будет происходить импорт через отдельную тулзу:
импортирует файлик в mpq архив карты
извлекает файлик .imp
добавляет настройки этой кнопки в этот файлик
импортирует файлик .imp
Вот и все, так что можете подучить какой-нибудь язык простенький, хотя бы делфи и вперед!)
globals
integer udg_p_i = 1
player array udg_p
endglobals
function int takes nothing returns nothing
local integer i = 1
loop
exitwhen i > 10
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
set udg_p[udg_p_i]=Player(i)
set udg_p_i = udg_p_i + 1
endif
set i = i + 1
endloop
endfunction
function cd takes nothing returns nothing
local integer i = 1
local integer cap = 0
loop
exitwhen i > udg_p_i
set cap = (5+LoadInteger(udg_hash, GetHandleId(udg_Player[GetPlayerId(udg_p[i])]), 2))
if GetHeroXP(udg_Player[GetPlayerId(udg_p[i])) < cap then
call AddHeroXP( udg_Player[GetPlayerId(udg_p[i]), 20, false )
endif
set i = i + 1
endloop
endfunction
Я так понял что статьи не помогут.
функцию int() вызови при инициализации
P.S.
Помогите сделать так, чтобы действия выполнялись не по циклу
ахахах, тогда закомменти пару строк)
тебе нужно создать соответствующие глобалки вручную
функция cd() это и есть функция которая должна быть в твоем действии
Если что непонятно, спрашиваем -_-
Одна и та же переменная в одном вызове функции не может принимать разные значения. Почему нельзя использовать две переменные?
Я вообще не очень понимаю, что ты хочешь сделать такой функцией. Опиши ситуацию, пожалуйста.
Вопрос решён. Не нужно ничего сортировать. Мне нужно было 3 первых места. Я просто в цикле сравнимал позицию данного игрока в ледербоарде с нужной мне позицией.
function GetRandomPlayerIndex takes nothing returns integer
set udg_Buf_A = 0
set bj_forLoopAIndex=0 //red
set bj_forLoopAIndexEnd=10 //light blue
loop
exitwhen(bj_forLoopAIndex>bj_forLoopAIndexEnd)
if(GetPlayerSlotState(Player(bj_forLoopAIndex))==PLAYER_SLOT_STATE_PLAYING)and(GetPlayerController(Player(bj_forLoopAIndex)))==MAP_CONTROL_USER)and(udg_AccEmpPlayer[bj_forLoopAIndex]==false)then
set udg_PlayersPlay[udg_Buf_A]=Player(bj_forLoopAIndex)
set udg_Buf_A=(udg_Buf_A+1)
endif
set bj_forLoopAIndex=bj_forLoopAIndex+1
endloop
set udg_Random=GetRandomInt(0,udg_Buf_A)
set udg_RndPlayer=udg_PlayersPlay[udg_Random]
return udg_RndPlayer
endfunction
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
В триггерах тип действий "Камера". Если конкретно расстояние до цели надо поменять, то "Камера - Установить Поле Камеры (Время)" ("Камера - Set Camera Field (Timed)").
Вероятнее всего, ты повышаешь камеру выше скайбокса.
Вероятные решения проблемы:
а) Уменьшить самих юнитов и стилизовать ланд под маленькие модели.
б) Вставить нестандартный скайбокс с огромным размером.
(я бы выбрал первый вариант, потому что он круче)
Meddin, меняй цели заклинания
всё работает просто у тебя руки не от туда
аффтару
без триггеров никак
делаем пустышку на основе канала
и при касте проверяем является ли цель врагом
если да то наносим урон
если нет то хилим
подробнее можешь прочесть там
Вам нужно изучить в редакторе звука как сделаны озвучки стандартных юнитов, тогда поймете по какому принципу формируются пакеты озвучки из отдельных файлов. Самый простой вариант - менять дефолт на импорт, карта Funny Bunny egg hunt от близзардов в помощь, это наглядное пособие по импорту озвучки и не только.
А что, разве уничтожить группу и почистить - разное для триггера?
Конечно, очистить группу - сделать группу пустой, а уничтожить - удалить сам объект типа "группа". Уничтожение в GUI недоступно, только через Custom Script, смотри карты, что я кидал.
BrEd Pitt, делать через найм юнитов или удалять призванного юнита если превышен лимит еды
а у абилки сбрасывать кд
и выдавать чтото наподобие "нужно построить зикурат"
А много ли юнитов будут с хп баром? если серьёзно то решения нет и фрейм не найти этот, оно зашито в недра движка. Но опять таки Disable pre-selection вариант всё таки, если потом отрисовать кастомные хп бары через специальную модель, если она будет эффектом, то это не вызовет никакой доп нагрузки даже у 100 юнитов.
может скинешь карту удали все что не связанно с предметами посмотрим что не так.
Вот скрин одного из предметов, который перестал работать. Boots of Travel - активка. Мне кажется это просто баг, так как перестает работать какой-то предмет, на самом деле, очень редко. Я думал может есть какое то логическое объяснение, но увы.
Спасибо за ответы.
Предлагаю для начала разбить действие на кучу мелких. Все расчёты разбить на мелкие и разнести по переменным, выводя на экран. А там и видно будет, ибо на скрине даже не вся строка видна.
NiktoTakoy, существует множество приказов
полного списка приказов не существует но есть частичный список в папке с джнгп (lib)
id приказов используются в спец функциях которые оканчиваются на ById (в гуи их нету вроде бы)
при желании ты можешь узнать айди нужного тебе приказа с помощью триггера предоставленного Mrachny
Steal nerves, насколько я понимаю, автору вопроса нужно совсем другое - он хочет чтобы у юнита было одновременно несколько улучшений на атаку, не важно откуда они берутся и даже не важно могут ли они быть активны одновременно. А проблема вся в циферке уровня улучшения на иконке атаки, которая начинает себя некорректно вести когда на атаку влияет больше одного улучшения.
можно просто исследование других рас насильно через триггер давать
Или создать копию улучшения для нейтралов и выдавать его триггерно при изучении родного, а циферку у юнита завязать именно на это улучшение. (одно улучшение для нейтралов, выдавать при изучении любого из соответствующих ему рассовых улучшений).
есть три события: начато исследование, отменено и завершено исследование.
запустить таймер в начале исследования. и из него узнать процент. есть нативки, позволяющие узнать: запущенное время, пройденное время и оставшее время до завершения
процент = пройденное время/запущенное время
при отмене или завершении удалить таймер
примерно как тутздесь даже проще, чем выяснить реальный процент стройки хуманов
Таких багов много, почему то оптимизатор берет данные из слк таблиц игры на часть объектов, пробуй wc3ultimate opt, на хайве выложена... Мб кто уже и новый виджитайзер запилил.
Тут скорее всего еще проблема с кодом карты, деоптимизаторы не восстанавливают данные на 100% и ошибки будут почти всегда, 100% рабочий способ - создавать объекты с нуля в карте руками, с теми же id и параметрами что в карте которую вы хотели восстановить...
В первую очередь, нужно выборочно оценивать и уменьшать размер текстур и количество мипмапов. Например, есть текстура кровли, которая в игре занимает существенную часть видимого пространства в декорациях, которая в целом как-то влияет своим качеством на восприятие картинки, и есть текстура какого-нибудь топорика, который держит в своих руках один из юнитов, и толком не разглядеть мелкие детали топорика. Но зачастую бывает так, что текстура топорика имеет размер 256х256 px, а текстура кровли 64х64 px.
Другой пример с иконками и другими элементами интерфейса, где не требуется более двух самых крупных мипмапов, а остальные можно благополучно удалить, т.к. оин почти ни при каких условиях не будут изображены.
Во-вторую очередь, нужно оптимизировать анимации нестандартных моделей юнитов. У нас до сих пор многие ничего не знают об этом, хотя уже есть инструмент, который делает это автоматически. Вот только Wiedzmin, автор тулзы пока ее не опубликовал, а пора бы дать всем ее пощупать.
Кроме оптимизации анимаций, следует применять все остальные способы, реализованные в mdlvis - это просто галочки, которые почистят прочий мусор, ничего сложного.
В Mdlvis используешь: Удаление свободных вершин, Удаление не связанных костей, Удаление ничейных КК, Линеаризация анимации. (настоятельно не рекомендую использовать параметр "Увеличение сжимаемости" как правило эта опция может удалять вершины тем самым испортив геометрию модели)
Переходим в Warcraft Model Editor, вкладка Редактировать-> Рассчитать границы
Сохраняем.
Как правило после расчета границ придется настраивать событийные объекты из за того что программа может сместить ключевые кадры, то есть нужно заново назначить им ключевые кадры например: следы от башмаков на земле должны быть видны только в анимации "Walk"
Переходим во вкладку Окна-> редактор узлов настраиваем видимость.
Сохраняем.
Опять открываем в WME сохраненную модель переходим во вкладку Менеджер текстур.
Там удаляем не используемые текстуры. Если не помнишь какие, то последовательно пытаешься удалить каждую текстуру, если WME ругается значит она используется если нет то ты нашел не нужную текстуру. Как правило после удаления поверхностей может остается ее анимация тут уже все ручками нужно удалять. Переходим во вкладку "Редактор анимации поверхности" и ищем не используемые удаляем.
Скачиваем MDX/M3 Optimizer c Хайва.
Разархивируем в отдельную папку, создаем там bat-ик, открываем блокнотом (перед этим копируем полный адрес папки, например: C:\Users\Asssssvi\Desktop\Warcraft Program\MDXM3 Optimizer)
вставляем следующее copt_win -p 32 -t 0.001 "адрес папки" и сохраняем.
скидываем в папку файл модели и перемещаем ее прямо на bat -ик должно получится "имя файла v2. mdx"
Этой программой мы удалили "бесполезные ключевые кадры" которые занимают лишнее(нет) место.
На этом в принципе все.
Помни что у каждой анимации должен быть первый и последний кадр(если кость была задействована в середине анимации и у нее будет отсутствовать начальный и последний кадр, то это будет ошибка, причем позиция и ротация точки это два разных параметра, то есть если ты изменил положение кости (переместил) то это перемещение должно иметь начальный и последний кадр так же и с ротацией они отдельны друг от друга, если этого нет, то анимация будет не коректно работать.
А на Хайвовском "Sanity test" будут сыпаться ошибки, кстати если все нормально то он должен показать серую надпись "Passed" то тогда можешь считать что она оптимизирована.
может скинешь карту удали все что не связанно с предметами посмотрим что не так.
Вот скрин одного из предметов, который перестал работать. Boots of Travel - активка. Мне кажется это просто баг, так как перестает работать какой-то предмет, на самом деле, очень редко. Я думал может есть какое то логическое объяснение, но увы.
Спасибо за ответы.
Предлагаю для начала разбить действие на кучу мелких. Все расчёты разбить на мелкие и разнести по переменным, выводя на экран. А там и видно будет, ибо на скрине даже не вся строка видна.
RobertStevenson, вейты вообще зло, а отсчёт можно сделать таймером. Точнее и без неожиданных багов.
Ждать пока - это вейт в цикле, работает это просто отвратно, сам с этим сталкивался. Лучше заменить на событие смерти колдуна.
Я всё же думаю, что дело не в вейтах. Выводи имя героя Hero[A]. Лучше выводить так: ("герой - ") + (Имя юнита (Hero[A])) + " " + (Число в строку (А)).
Если нет имени - героя просто нет в этой переменной.
Ну еще один вариант... Как я понял ты в начале игры выбираешь себе героя покупая в таверне. Так вот: Тебе понадобиться сделать 2 области.
И подставить свои значения в этот триггер (место Playble map area выбрать область в какую хочешь переместить героя)
Когда ты покупаешь героя он " входит в область" вокруг таверны (не забудь ее сделать).Дальше он перемещается в указанную тобой другую область (ее тоже не забудь). И я не добавил одно действие убить того кто покупал героя (у меня был светлячок).
Вроде бы все объяснил.
Если что не понятно пиши мне в ЛС.
Ну суть в том что при доведении здания до разрушения (смерти) оно переходит во владение тому игроку, который его и добил. Проще говоря - твой ластхит по вражескому зданию передаёт его тебе.
По-хорошему первое что надо сделать - запретить союзникам атаковать свои здания (или хотя бы столицы, о которых и идёт речь).
Второе - при получении зданием урона проверять кто его нанёс, если друг - отхиливать на весь урон, если враг - проверять не будет ли этот урон смертельным, и если ДА - давать столько хп, сколько надо что бы здание осталось в живых (обычно это урон + 1 хп). И при этом передавать юнита во владение тому игроку, который владеет юнитом который является источником этого урона.
По желанию можно отхилить здание полностью (на 100% своего хп)
Если по игроку то массив переменных по игроку, если прям каждого конкретного героя каждого игрока - то через custom value или прочий регистратор юнитов.
» WarCraft 3 / Движение без поворота
» WarCraft 3 / Кнопка постройки здания
» WarCraft 3 / Игровые зоны.
» WarCraft 3 / Импорт текстуры с помощью Retera's Model Studio
» WarCraft 3 / Импорт DISBTN
» WarCraft 3 / Массивы и номера игроков
» WarCraft 3 / Летают части моделей.
» WarCraft 3 / Высота камеры
» StarCraft 2 / Как создать мод
» WarCraft 3 / Удаление предмета с 0 жизнями
» WarCraft 3 / Добыча дерева триггерно
» WarCraft 3 / Система войн при нападении на игрока.
» WarCraft 3 / Пища и призванные юниты
» WarCraft 3 / Текстуры в Reforged.
» WarCraft 3 / Почему может не работать триггер?
» WarCraft 3 / Найм другому игроку
» WarCraft 3 / WURST Импорт иконок
» Администрация XGM / Дата заданий
» WarCraft 3 / Бинды для персонажей Warcraft3 1.26, где же они хранятся?
» WarCraft 3 / Отображение юнита игрока
» WarCraft 3 / Оптимизация.
» WarCraft 3 / Почему может не работать триггер?
» WarCraft 3 / Как сделать такой триггер?
» WarCraft 3 / Помощь с условием тригера